﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;

namespace Service.ZSJL.Com.Graphic
{
    public class ImgUtils
    {
        /// <summary> 
        /// 正方型裁剪 
        /// 以图片中心为轴心，截取正方型，然后等比缩放 
        /// 用于头像处理 
        /// </summary>      
        /// <param name="postedFile">原图片对象</param> 
        /// <param name="fileSaveUrl">缩略图存放地址</param> 
        /// <param name="side">指定的边长（正方型）</param> 
        /// <param name="quality">质量（范围0-100）</param> 
        public static void CutForSquare(Image postedFile, string fileSaveUrl, int side, int quality)
        {
            //创建目录 
            string dir = Path.GetDirectoryName(fileSaveUrl);
            if (!Directory.Exists(dir))
                Directory.CreateDirectory(dir);
            Image initImage = postedFile;
            //原图宽高均小于模版，不作处理，直接保存 
            if (initImage.Width <= side && initImage.Height <= side)
            {
                initImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            else
            {
                //原始图片的宽、高 
                int initWidth = initImage.Width;
                int initHeight = initImage.Height;

                //非正方型先裁剪为正方型 
                if (initWidth != initHeight)
                {
                    //截图对象 
                    System.Drawing.Image pickedImage = null;
                    System.Drawing.Graphics pickedG = null;

                    //宽大于高的横图 
                    if (initWidth > initHeight)
                    {
                        //对象实例化 
                        pickedImage = new System.Drawing.Bitmap(initHeight, initHeight);
                        pickedG = System.Drawing.Graphics.FromImage(pickedImage);
                        //设置质量 
                        pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                        pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                        //定位 
                        Rectangle fromR = new Rectangle((initWidth - initHeight) / 2, 0, initHeight, initHeight);
                        Rectangle toR = new Rectangle(0, 0, initHeight, initHeight);
                        //画图 
                        pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
                        //重置宽 
                        initWidth = initHeight;
                    }
                    //高大于宽的竖图 
                    else
                    {
                        //对象实例化 
                        pickedImage = new System.Drawing.Bitmap(initWidth, initWidth);
                        pickedG = System.Drawing.Graphics.FromImage(pickedImage);
                        //设置质量 
                        pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                        pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                        //定位 
                        Rectangle fromR = new Rectangle(0, (initHeight - initWidth) / 2, initWidth, initWidth);
                        Rectangle toR = new Rectangle(0, 0, initWidth, initWidth);
                        //画图 
                        pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);
                        //重置高 
                        initHeight = initWidth;
                    }

                    //将截图对象赋给原图 
                    initImage = (System.Drawing.Image)pickedImage.Clone();
                    //释放截图资源 
                    pickedG.Dispose();
                    pickedImage.Dispose();
                }

                //缩略图对象 
                System.Drawing.Image resultImage = new System.Drawing.Bitmap(side, side);
                System.Drawing.Graphics resultG = System.Drawing.Graphics.FromImage(resultImage);
                //设置质量 
                resultG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                resultG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                //用指定背景色清空画布 
                resultG.Clear(Color.White);
                //绘制缩略图 
                resultG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, side, side), new System.Drawing.Rectangle(0, 0, initWidth, initHeight), System.Drawing.GraphicsUnit.Pixel);

                //关键质量控制 
                //获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff 
                ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();
                ImageCodecInfo ici = null;
                foreach (ImageCodecInfo i in icis)
                {
                    if (i.MimeType == "image/jpeg" || i.MimeType == "image/bmp" || i.MimeType == "image/png" || i.MimeType == "image/gif")
                    {
                        ici = i;
                    }
                }
                EncoderParameters ep = new EncoderParameters(1);
                ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);

                //保存缩略图 
                resultImage.Save(fileSaveUrl, ici, ep);

                //释放关键质量控制所用资源 
                ep.Dispose();

                //释放缩略图资源 
                resultG.Dispose();
                resultImage.Dispose();

                //释放原始图片资源 
                initImage.Dispose();
            }

        }

        /// <summary> 
        /// 正方型裁剪 
        /// 以图片中心为轴心，截取正方型，然后等比缩放 
        /// 用于头像处理 
        /// </summary>      
        /// <param name="localImgUrl">本地图片路径</param> 
        /// <param name="fileSaveUrl">缩略图存放地址</param> 
        /// <param name="side">指定的边长（正方型）</param> 
        /// <param name="quality">质量（范围0-100）</param> 
        public static void CutForSquare(string localImgUrl, string fileSaveUrl, int side, int quality)
        {
            Image img = Bitmap.FromFile(localImgUrl);
            CutForSquare(img, fileSaveUrl, side, quality);
        }


        #region 正方型裁剪并缩放
        /// <summary> 
        /// 正方型裁剪 
        /// 以图片中心为轴心，截取正方型，然后等比缩放 
        /// 用于头像处理 
        /// </summary>      
        /// <param name="postedFile">原图HttpPostedFile对象</param> 
        /// <param name="fileSaveUrl">缩略图存放地址</param> 
        /// <param name="side">指定的边长（正方型）</param> 
        /// <param name="quality">质量（范围0-100）</param> 
        public static void CutForSquare(System.Web.HttpPostedFile postedFile, string fileSaveUrl, int side, int quality)
        {


            //原始图片（获取原始图片创建对象，并使用流中嵌入的颜色管理信息） 
            System.Drawing.Image initImage = System.Drawing.Image.FromStream(postedFile.InputStream, true);

            CutForSquare(initImage, fileSaveUrl, side, quality);
        }

        /// <summary> 
        /// 正方型裁剪 
        /// 以图片中心为轴心，截取正方型，然后等比缩放 
        /// 用于头像处理 
        /// </summary>      
        /// <param name="fromFile">原图HttpPostedFile对象</param> 
        /// <param name="fileSaveUrl">缩略图存放地址</param> 
        /// <param name="side">指定的边长（正方型）</param> 
        /// <param name="quality">质量（范围0-100）</param> 
        public static void CutForSquare(System.IO.Stream fromFile, string fileSaveUrl, int side, int quality)
        {


            //原始图片（获取原始图片创建对象，并使用流中嵌入的颜色管理信息） 
            System.Drawing.Image initImage = System.Drawing.Image.FromStream(fromFile, true);
            CutForSquare(initImage, fileSaveUrl, side, quality);

        }
        #endregion
        /// <summary> 
        /// 把指定文件夹内的图片等比缩放 
        /// </summary>       
        /// <param name="ImgPaths">图片本地文件夹</param> 
        /// <param name="savePath">缩略图存放地址</param> 
        /// <param name="targetWidth">指定的最大宽度</param> 
        /// <param name="targetHeight">指定的最大高度</param> 
        /// <param name="watermarkText">水印文字(为""表示不使用水印)</param> 
        /// <param name="watermarkImage">水印图片路径(为""表示不使用水印)</param> 
        public static void ZoomAuto(string[] ImgPaths, string savePath, System.Double targetWidth, System.Double targetHeight, string watermarkText, string watermarkImage)
        {
            System.Drawing.Image initImage = null;
            foreach (string img in ImgPaths)
            {
                initImage = System.Drawing.Image.FromFile(img);
                ZoomAuto(initImage, savePath + "\\" + Path.GetFileName(img), targetWidth, targetHeight, watermarkText, watermarkImage);
            }
        }




        /// <summary> 
        /// 图片等比缩放 
        /// </summary>       
        /// <param name="lcimgUrl">图片本地URL</param> 
        /// <param name="savePath">缩略图存放地址</param> 
        /// <param name="targetWidth">指定的最大宽度</param> 
        /// <param name="targetHeight">指定的最大高度</param> 
        /// <param name="watermarkText">水印文字(为""表示不使用水印)</param> 
        /// <param name="watermarkImage">水印图片路径(为""表示不使用水印)</param> 
        public static void ZoomAuto(string lcimgUrl, string savePath, System.Double targetWidth, System.Double targetHeight, string watermarkText, string watermarkImage)
        {
            System.Drawing.Image initImage = System.Drawing.Image.FromFile(lcimgUrl);
            ZoomAuto(initImage, savePath, targetWidth, targetHeight, watermarkText, watermarkImage);
        }
        /// <summary> 
        /// 图片等比缩放 
        /// </summary>       
        /// <param name="postedFile">原图HttpPostedFile对象</param> 
        /// <param name="savePath">缩略图存放地址</param> 
        /// <param name="targetWidth">指定的最大宽度</param> 
        /// <param name="targetHeight">指定的最大高度</param> 
        /// <param name="watermarkText">水印文字(为""表示不使用水印)</param> 
        /// <param name="watermarkImage">水印图片路径(为""表示不使用水印)</param> 
        public static void ZoomAuto(System.Web.HttpPostedFile postedFile, string savePath, System.Double targetWidth, System.Double targetHeight, string watermarkText, string watermarkImage)
        {
            System.Drawing.Image initImage = System.Drawing.Image.FromStream(postedFile.InputStream, true);
            ZoomAuto(initImage, savePath, targetWidth, targetHeight, watermarkText, watermarkImage);
        }


        /// <summary> 
        /// 图片等比缩放 
        /// </summary>       
        /// <param name="inputStream">原图stream对象</param> 
        /// <param name="savePath">缩略图存放地址</param> 
        /// <param name="targetWidth">指定的最大宽度</param> 
        /// <param name="targetHeight">指定的最大高度</param> 
        /// <param name="watermarkText">水印文字(为""表示不使用水印)</param> 
        /// <param name="watermarkImage">水印图片路径(为""表示不使用水印)</param> 
        public static void ZoomAuto(Stream inputStream, string savePath, System.Double targetWidth, System.Double targetHeight, string watermarkText, string watermarkImage)
        {
            System.Drawing.Image initImage = System.Drawing.Image.FromStream(inputStream, true);
            ZoomAuto(initImage, savePath, targetWidth, targetHeight, watermarkText, watermarkImage);
        }

        #region 等比缩放
        /// <summary> 
        /// 图片等比缩放 
        /// </summary>       
        /// <param name="postedFile">原图片对象</param> 
        /// <param name="savePath">缩略图存放地址</param> 
        /// <param name="targetWidth">指定的最大宽度</param> 
        /// <param name="targetHeight">指定的最大高度</param> 
        /// <param name="watermarkText">水印文字(为""表示不使用水印)</param> 
        /// <param name="watermarkImage">水印图片路径(为""表示不使用水印)</param> 
        public static void ZoomAuto(Image postedFile, string savePath, System.Double targetWidth, System.Double targetHeight, string watermarkText, string watermarkImage)
        {
            //创建目录 
            string dir = Path.GetDirectoryName(savePath);
            if (!Directory.Exists(dir))
                Directory.CreateDirectory(dir);

            //原始图片（获取原始图片创建对象，并使用流中嵌入的颜色管理信息） 
            System.Drawing.Image initImage = postedFile;// System.Drawing.Image.FromStream(postedFile.InputStream, true);

            //原图宽高均小于模版，不作处理，直接保存 
            #region   //原图宽高均小于模版，不作处理，直接保存
            if (initImage.Width <= targetWidth && initImage.Height <= targetHeight)
            {
                //文字水印 
                TextWaterMark(watermarkText,ref initImage);

                //透明图片水印 
                MakeWaterMark(watermarkImage, ref initImage);

                //保存 
                initImage.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            #endregion
            #region  原图大于模板
            else
            {
                //缩略图宽、高计算 
                double newWidth = initImage.Width;
                double newHeight = initImage.Height;

                //宽大于高或宽等于高（横图或正方） 
                if (initImage.Width > initImage.Height || initImage.Width == initImage.Height)
                {
                    //如果宽大于模版 
                    if (initImage.Width > targetWidth)
                    {
                        //宽按模版，高按比例缩放 
                        newWidth = targetWidth;
                        newHeight = initImage.Height * (targetWidth / initImage.Width);
                    }
                }
                //高大于宽（竖图） 
                else
                {
                    //如果高大于模版 
                    if (initImage.Height > targetHeight)
                    {
                        //高按模版，宽按比例缩放 
                        newHeight = targetHeight;
                        newWidth = initImage.Width * (targetHeight / initImage.Height);
                    }
                }

                //生成新图 
                //新建一个bmp图片 
                System.Drawing.Image newImage = new System.Drawing.Bitmap((int)newWidth, (int)newHeight);
                //新建一个画板 
                System.Drawing.Graphics newG = System.Drawing.Graphics.FromImage(newImage);

                //设置质量 
                newG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                newG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

                //置背景色 
                newG.Clear(Color.White);
                //画图 
                newG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, newImage.Width, newImage.Height), new System.Drawing.Rectangle(0, 0, initImage.Width, initImage.Height), System.Drawing.GraphicsUnit.Pixel);

                //文字水印 
                TextWaterMark(watermarkText, ref newImage);

                //透明图片水印 
                MakeWaterMark(watermarkImage, ref newImage);

                //保存缩略图 
                newImage.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg);

                //释放资源   
                newG.Dispose();
                newImage.Dispose();
                initImage.Dispose();

            }
            #endregion
        }


        /// <summary>
        /// 文字水印
        /// </summary>
        /// <param name="watermarkText"></param>
        /// <param name="initImage"></param>
        private static void TextWaterMark(string watermarkText,ref System.Drawing.Image initImage)
        {
            if (watermarkText != "")
            {
                using (System.Drawing.Graphics gWater = System.Drawing.Graphics.FromImage(initImage))
                {
                    System.Drawing.Font fontWater = new Font("黑体", 10);
                    System.Drawing.Brush brushWater = new SolidBrush(Color.White);
                    gWater.DrawString(watermarkText, fontWater, brushWater, 10, 10);
                    gWater.Dispose();
                }
            }
        }


        /// <summary>
        /// 图片水印
        /// </summary>
        /// <param name="watermarkImage"></param>
        /// <param name="initImage"></param>
        private static void MakeWaterMark(string watermarkImage,ref System.Drawing.Image initImage)
        {

            if (watermarkImage != "")
            {
                if (File.Exists(watermarkImage))
                {
                    //获取水印图片 
                    using (System.Drawing.Image wrImage = System.Drawing.Image.FromFile(watermarkImage))
                    {
                        //水印绘制条件：原始图片宽高均大于或等于水印图片 
                        if (initImage.Width >= wrImage.Width && initImage.Height >= wrImage.Height)
                        {
                            Graphics gWater = Graphics.FromImage(initImage);

                            //透明属性 
                            //ImageAttributes imgAttributes = new ImageAttributes();
                            //ColorMap colorMap = new ColorMap();
                            //colorMap.OldColor = Color.FromArgb(255, 0, 255, 0);
                            //colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);
                            //ColorMap[] remapTable = { colorMap };
                            //imgAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);

                            //float[][] colorMatrixElements = {  
                            //       new float[] {1.0f,  0.0f,  0.0f,  0.0f, 0.0f}, 
                            //       new float[] {0.0f,  1.0f,  0.0f,  0.0f, 0.0f}, 
                            //       new float[] {0.0f,  0.0f,  1.0f,  0.0f, 0.0f}, 
                            //       new float[] {0.0f,  0.0f,  0.0f,  0.5f, 0.0f},//透明度:0.5 
                            //       new float[] {0.0f,  0.0f,  0.0f,  0.0f, 1.0f} 
                            //    };

                            //ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements);
                            //imgAttributes.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
                            gWater.DrawImage(wrImage, new Rectangle(initImage.Width - wrImage.Width, initImage.Height - wrImage.Height, wrImage.Width, wrImage.Height), 0, 0, wrImage.Width, wrImage.Height, GraphicsUnit.Pixel);

                            gWater.Dispose();
                        }
                        wrImage.Dispose();
                    }
                }
            }
        }

        #endregion


        #region 区域裁剪

        /// <summary>
        /// 区域裁剪图片
        /// </summary>
        /// <param name="ImgFile">图片路径</param>
        /// <param name="savePath">生成图片路径</param>
        /// <param name="PicWidth">显示图片宽</param>
        /// <param name="PicHeight">显示图片高</param>
        /// <param name="PointX">目标X坐标</param>
        /// <param name="PointY">目标Y坐标</param>
        /// <param name="CutWidth">裁剪宽</param>
        /// <param name="CutHeight">裁剪高</param>
        public static void AreaCut(string ImgFile, string savePath, int PicWidth, int PicHeight, int PointX, int PointY, int CutWidth, int CutHeight)
        {
            //创建目录 
            string dir = Path.GetDirectoryName(savePath);
            if (!Directory.Exists(dir))
                Directory.CreateDirectory(dir);

            Image imgPhoto = null;
            Bitmap bmPhoto = null;
            Graphics gbmPhoto = null;

            try
            {
                imgPhoto = Image.FromFile(ImgFile);

                bmPhoto = new Bitmap(CutWidth, CutHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);

                gbmPhoto = Graphics.FromImage(bmPhoto);

                gbmPhoto.DrawImage(imgPhoto, new Rectangle(0, 0, CutWidth, CutHeight), PointX * imgPhoto.Width / PicWidth, PointY * imgPhoto.Height / PicHeight, CutWidth * imgPhoto.Width / PicWidth, CutHeight * imgPhoto.Height / PicHeight, GraphicsUnit.Pixel);

                bmPhoto.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            finally
            {
                imgPhoto.Dispose();

                gbmPhoto.Dispose();

                bmPhoto.Dispose();
            }
        }


        #endregion

        #region 其它
        /// <summary> 
        /// 判断文件类型是否为WEB格式图片 
        /// (注：JPG,GIF,BMP,PNG) 
        /// </summary> 
        /// <param name="contentType">HttpPostedFile.ContentType</param> 
        /// <returns></returns> 
        public static bool IsWebImage(string contentType)
        {
            if (contentType == "image/pjpeg" || contentType == "image/jpeg" || contentType == "image/gif" || contentType == "image/bmp" || contentType == "image/png")
            {
                return true;
            }
            else
            {
                return false;
            }
        }


        /// <summary>
        /// 根据后缀名判断是否为图片
        /// </summary>
        /// <param name="extension"></param>
        /// <returns></returns>
        public static bool IsImage(string extension)
        {
            extension = extension.ToLower();

            if (extension == ".jpeg" || extension == ".jpg" || extension == ".png" || extension == ".gif" || extension == ".bmp")
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary>
        /// 将image转化为二进制 
        /// </summary>
        /// <param name="img"></param>
        /// <returns></returns>
        public static byte[] GetByteImage(Image img)
        {

            byte[] bt = null;

            if (!img.Equals(null))
            {
                using (MemoryStream mostream = new MemoryStream())
                {
                    Bitmap bmp = new Bitmap(img);

                    bmp.Save(mostream, System.Drawing.Imaging.ImageFormat.Jpeg);//将图像以指定的格式存入缓存内存流

                    bt = new byte[mostream.Length];

                    mostream.Position = 0;//设置留的初始位置

                    mostream.Read(bt, 0, Convert.ToInt32(bt.Length));

                }

            }

            return bt;

        }


        /// <summary>
        /// 读取byte[]并转化为图片
        /// </summary>
        /// <param name="bytes">byte[]</param>
        /// <returns>Image</returns>
        public static Image GetImageByBytes(byte[] bytes)
        {
            Image photo = null;
            using (MemoryStream ms = new MemoryStream(bytes))
            {
                ms.Write(bytes, 0, bytes.Length);
                photo = Image.FromStream(ms, true);
            }

            return photo;
        }


        #endregion
    }
}
